package com.etoak.controller;


import cn.hutool.core.util.StrUtil;
import com.etoak.entity.Position;
import com.etoak.entity.User;
import com.etoak.service.PositionService;
import com.etoak.service.UserService;
import com.etoak.tool.PositionTool;
import com.etoak.utils.IUUID;
import com.etoak.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import java.util.HashSet;
import java.util.List;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author et2107
 * @since 2024-01-18
 */
@RestController
@RequestMapping("/position")
public class PositionController {

    @Autowired
    PositionService positionService;

    @Autowired
    UserService userService;

    /**
     * 添加位置信息
     * @param position
     * @return
     */
    @PostMapping("/addPositionData")
    public R addPositionData(@RequestBody Position position) {

        // 经纬度时间不允许为空
        if (!PositionTool.positionIsTrue(position)) {
            return R.error(null).msg("位置信息存在错误");
        }

        // 判断用户是否存在
        if (!hasUser(position)){
            return R.error(null).msg("用户id不正确");
        }

        // 设置id
        position.setId(IUUID.getUUID());

        // 保存位置信息
        positionService.save(position);

        return R.success().msg("添加成功");
    }

    /**
     * 批量添加位置信息
     * @param positions
     * @return
     */
    @PostMapping("/addPositionDataList")
    public R addPositionDataList(@RequestBody List<Position> positions) {

        // 经纬度时间不允许为空
        if (!PositionTool.positionIsTrue(positions)) {
            return R.error(null).msg("位置信息存在错误");
        }

        // 判断用户是否存在
        if (!hasUser(positions)){
            return R.error(null).msg("用户id不正确");
        }

        // 设置id
        for (Position position : positions) {
            position.setId(IUUID.getUUID());
        }

        // 批量保存
        positionService.saveBatch(positions);

        return R.success().msg("添加成功");


    }

    /**
     * 修改位置信息
     * @param position
     * @return
     */
    @PostMapping("/updatePositionData")
    public R updatePositionData(@RequestBody Position position){

        // 检查位置信息是否合法
        if (!PositionTool.positionIsTrue(position)) {
            return R.error(null).msg("位置信息存在错误");
        }

        // 检查位置id是否存在
        if (StrUtil.isEmpty(position.getId()) ){
            return R.error(null).msg("位置信息id不能为空");
        }

        // 检查数据库中是否存在该id数据
        Position byId = positionService.getById(position.getId());
        if (null == byId){
            return R.error(null).msg("位置信息不存在");
        }

        positionService.updateById(position);

        return R.success().msg("修改成功");

    }

    /**
     * 判断位置信息中的用户是否存在
     *
     * @param position
     * @return
     */
    public boolean hasUser(Position position) {

        User user = userService.getById(position.getUid());
        if (user == null) {
            return false;
        }
        return true;
    }

    /**
     * 批量判断位置信息中的用户是否存在
     *
     * @param positions
     * @return
     */
    public boolean hasUser(List<Position> positions) {

        HashSet<String> uids = new HashSet<>();

        // 对uid去重
        for (Position position : positions) {
            uids.add(position.getUid());
        }

        for (String uid : uids) {
            User user = userService.getById(uid);
            if (user == null) {
                return false;
            }
        }

        return true;
    }

}

